package ar.edu.caece.pl.asem.model.impl.treeelements;

import ar.edu.caece.pl.asem.temp.TemporalGenerator;

public class ProductoInt extends AbstractElement {

	private int tempResultProdInt; // propio para producto de enteros, se usa
									// para guardar el resultado de un producto
									// temporal.

	public ProductoInt() {
		this.label = "PRODUCTO_ENTERO";
	}

	public int getTemp() {
		return tempResultProdInt;
	}

	public void setTemp(int tempResultProdInt) {
		this.tempResultProdInt = tempResultProdInt;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof ProductoInt))
			return false;
		ProductoInt other = (ProductoInt) obj;
		if (label == null) {
			if (other.label != null)
				return false;
		} else if (!label.equals(other.label))
			return false;
		return true;
	}

	@Override
	public void generateASMCode() {
		StringBuffer sb = new StringBuffer();
		String term = null;
		String multiplicadorName;

		AbstractElement multiplicado = this.getChildren().get(0);
		AbstractElement multiplicador = this.getChildren().get(1);
		multiplicado.parent = this;
		TemporalGenerator.getInstance().generateTemporal();
		multiplicado.generateASMCode();
		sb.append(multiplicado.code);

		this.place = TemporalGenerator.getInstance().getActualTemporal();

		if (this.parent instanceof SumaInt || this.parent instanceof RestaInt || this.parent instanceof SumaNat || this.parent instanceof RestaNat) {
			TemporalGenerator.getInstance().releaseTemporal();
			term = TAB + "mov " + TemporalGenerator.getInstance().getActualTemporal() + ",ax" + ENTER;
		}
		
		if(multiplicador instanceof Parametro){
			multiplicadorName = "[bp+"+ ((Parametro) multiplicador).getMemoryInStack() +']';
		}else{
			if(multiplicador instanceof NumeroInt){
				multiplicadorName = String.valueOf(((NumeroInt) multiplicador).getValue());
			}else if((multiplicador instanceof Variable && ((Variable) multiplicador).getMemoryInStack() != 0)){
				multiplicadorName = "[bp-"+ ((Variable) multiplicador).getMemoryInStack() +']';
			}else{
				multiplicadorName = multiplicador.getEnvName() + "_" + multiplicador.getName();
			}
		}

		sb.append(getMul(this.place, this.place, multiplicadorName));

		if (term != null) {
			sb.append(term);
		}

		this.code = sb.toString();

	}

	private String getMul(String label, String op1, String op2) {
		StringBuffer sb = new StringBuffer();
		sb.append(TAB + "mov ax, " + op2 + ENTER);
		sb.append(TAB + "mov bx, ax" + ENTER);
		sb.append(TAB + "mov ax, " + op1 + ENTER);
		sb.append(TAB + "imul bx" + ENTER);
		sb.append(TAB + "mov " + label + ",ax" + ENTER);
		return sb.toString();
	}
	
}
